Batch Processing এবং Fetch Strategies হল NHibernate এর দুটি গুরুত্বপূর্ণ কৌশল, যা পারফরম্যান্স অপটিমাইজেশন এবং ডেটা ফেচিং কার্যক্রমকে আরও দক্ষ করে তোলে। এদের ব্যবহার আপনাকে অনেক বড় ডেটাসেটের উপর কাজ করতে সাহায্য করবে, এবং ডেটাবেসের সাথে ইন্টারঅ্যাকশন আরও কার্যকরভাবে করবে।
Batch Processing
Batch Processing হল একটি কৌশল যার মাধ্যমে আপনি একাধিক ডেটাবেস অপারেশন (যেমন ইনসার্ট, আপডেট, ডিলিট) একত্রে একাধিক রেকর্ড প্রক্রিয়া করতে পারেন। এটি মূলত ডেটাবেসে একাধিক রেকর্ড প্রক্রিয়াকরণের জন্য একাধিক কুয়েরি চালানোর পরিবর্তে একটি একক ব্যাচের মধ্যে অনেকগুলি অপারেশন একসাথে প্রক্রিয়া করে।
1. Batch Processing কনফিগারেশন
NHibernate এ Batch Processing কনফিগার করার জন্য আপনাকে কিছু প্রপার্টি কনফিগার করতে হবে। সাধারণত hibernate.cfg.xml ফাইলে এই কনফিগারেশন দেওয়া হয়।
<hibernate-configuration>
<session-factory>
<!-- Enable batch processing -->
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
</session-factory>
</hibernate-configuration>
এখানে:
- hibernate.jdbc.batch_size: এখানে আপনি কতগুলো রেকর্ড একসাথে ইনসার্ট, আপডেট বা ডিলিট করতে চান তা নির্ধারণ করতে পারবেন।
- hibernate.order_inserts এবং hibernate.order_updates: এই প্রপার্টি গুলো কনফিগার করলে NHibernate ইনসার্ট বা আপডেট অপারেশন গুলোকে সঠিকভাবে অর্ডার করবে, যাতে ব্যাচ প্রক্রিয়া আরও দক্ষ হয়।
2. Batch Processing Example
ধরা যাক, আমাদের কাছে ১০০০টি Employee অবজেক্ট আছে এবং আমরা এগুলো ডেটাবেসে ইনসার্ট করতে চাই।
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
for (int i = 0; i < 1000; i++)
{
var employee = new Employee
{
Name = "Employee " + i,
Position = "Position " + i
};
session.Save(employee);
// Every 20 records, flush the session to execute the batch
if (i % 20 == 0)
{
session.Flush();
session.Clear();
}
}
transaction.Commit();
}
এখানে:
- প্রতি ২০টি রেকর্ড ইনসার্ট করার পর session.Flush() এবং session.Clear() মেথড ব্যবহার করা হয়েছে, যাতে রেকর্ডগুলি ডেটাবেসে সংরক্ষণ হয় এবং সেশন পরিষ্কার হয়। এর ফলে ব্যাচ প্রক্রিয়া আরও কার্যকরী হয়।
NHibernate এর Fetch Strategies
Fetch Strategies হল কৌশল যা দিয়ে NHibernate ডেটা ফেচিং নিয়ন্ত্রণ করে। এটি দুটি প্রকারে বিভক্ত: Eager Fetching এবং Lazy Fetching। সঠিক ফেচ স্ট্রাটেজি নির্বাচন করে আপনি ডেটাবেসের সাথে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজ করতে পারেন।
1. Lazy Loading (Lazy Fetching)
Lazy Loading হল এমন একটি কৌশল, যেখানে শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয়। অর্থাৎ, সম্পর্কিত অবজেক্টগুলো তখনই লোড হয়, যখন সেগুলির অ্যাক্সেস করা হয়।
Lazy Loading সাধারণত সম্পর্কিত ডেটাবেস টেবিলের তথ্য একটি Proxy Object হিসেবে লোড করা হয়। যখন আপনার সেই অবজেক্টের প্রোপার্টি বা মেথড কল করা হবে, তখন তা ডেটাবেস থেকে লোড হবে।
public class Employee
{
public virtual int EmployeeId { get; set; }
public virtual string Name { get; set; }
// Lazy loading for Department
public virtual Department Department { get; set; }
}
এখানে Department প্রোপার্টি lazy loading সেট করা হয়েছে। যখন আপনি Department প্রোপার্টি অ্যাক্সেস করবেন, তখন তা ডেটাবেস থেকে লোড হবে।
2. Eager Loading (Eager Fetching)
Eager Loading হল এমন একটি কৌশল, যেখানে সম্পর্কিত সমস্ত ডেটা একসাথে লোড করা হয়, অর্থাৎ মূল অবজেক্ট এবং তার সম্পর্কিত অবজেক্ট (যেমন একাধিক টেবিলের ডেটা) একই সময়ে ডেটাবেস থেকে লোড হয়।
এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি জানেন যে সম্পর্কিত অবজেক্টগুলির ডেটা ভবিষ্যতে ব্যবহৃত হবে এবং একাধিক SQL কুয়েরি চালানোর চেয়ে একক কুয়েরি দিয়ে সবকিছু একত্রে লোড করা ভালো।
public class Employee
{
public virtual int EmployeeId { get; set; }
public virtual string Name { get; set; }
// Eager loading for Department
public virtual Department Department { get; set; }
}
এখানে, Department প্রোপার্টি eager loading করা হয়েছে, যার মানে হল যে যখন Employee অবজেক্ট লোড হবে, তখন Department অবজেক্টও একসাথে লোড হবে।
3. Fetch Types - FetchType এবং FetchMode
NHibernate এ FetchType এবং FetchMode কনফিগার করে আপনি Lazy বা Eager লোডিং নিয়ন্ত্রণ করতে পারেন।
var query = session.Query<Employee>()
.Fetch(x => x.Department) // Eager fetch
.ToList();
এখানে:
.Fetch(x => x.Department)এর মাধ্যমেDepartmentঅবজেক্টকে Eagerly Fetch করা হয়েছে, অর্থাৎ একত্রে লোড করা হয়েছে।
4. Join Fetching
যখন আপনি সম্পর্কিত টেবিলের ডেটা একসাথে আনতে চান, তখন Join Fetching ব্যবহার করা হয়। এতে, INNER JOIN বা LEFT JOIN ব্যবহার করা হয় এবং সম্পর্কিত ডেটা একত্রে লোড করা হয়।
var employees = session.Query<Employee>()
.Fetch(x => x.Department) // Join fetching with Department
.ToList();
এখানে, Department এর ডেটা Join করে লোড হচ্ছে।
Batch Processing এবং Fetch Strategies এর পারফরম্যান্স ইম্প্যাক্ট
- Batch Processing: আপনি যদি একাধিক ডেটা রেকর্ড ইনসার্ট বা আপডেট করতে চান, তবে ব্যাচ প্রক্রিয়া ব্যবহার করা পারফরম্যান্সে অনেক ভালো ফল দেয়। একাধিক কুয়েরি না চালিয়ে একক ব্যাচে অনেক রেকর্ড প্রক্রিয়া করলে, নেটওয়ার্ক এবং ডেটাবেসে লোড কমে যায় এবং কর্মক্ষমতা বাড়ে।
- Lazy Fetching: শুধুমাত্র প্রয়োজনীয় ডেটা লোড করে আপনার অ্যাপ্লিকেশনকে দ্রুত এবং আরও দক্ষ করে তোলে। এটি একাধিক সেশন বা কুয়েরি চালানোর প্রয়োজন বন্ধ করে দেয়।
- Eager Fetching: যখন আপনি জানেন যে সম্পর্কিত ডেটা পরবর্তী সময়ে ব্যবহৃত হবে, তখন Eager Fetching ব্যবহার করা যায়। তবে এটি যদি অতিরিক্ত ডেটা লোড করে দেয়, তাহলে কর্মক্ষমতা কমতে পারে।
এভাবে, সঠিক Batch Processing এবং Fetch Strategies নির্বাচন করে আপনি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা আরও ভাল করতে পারেন।
Read more